Internet applications such as network-based games and collaboration tools often need to exchange traffic between endpoints in an end-to-end fashion. For some of these applications, one endpoint behaves as the server (i.e. source) while the other behaves as the client (i.e. destination). In other applications, all endpoints behave as both client and server. Typically, connections are established between endpoints using the Transport Control Protocol (TCP) or the User Datagram Protocol (UDP) or sometimes a combination of both.
Some applications work well as long as the endpoints behaving as servers have public IP addresses. However, some applications require clients to have a public IP address as well, for example to allow servers to send notifications to clients. Given that endpoints in the current Internet are often behind Network Address Translators (NATs), applications that require one or more participants to have public IP addresses typically do not work. It is unacceptable that an application will work with some users having public IP addresses but will not work for other users not having public IP addresses as this will likely result in confusion and frustration.